package vaccine.appointment.system.inventory.service;

import vaccine.appointment.system.inventory.dataobject.Inventory;
import vaccine.appointment.system.inventory.mq.LowInventoryCapacityMessage;
import vaccine.appointment.system.inventory.vo.AddInventoryRequest;
import vaccine.appointment.system.inventory.vo.InventoryVO;
import vaccine.appointment.system.inventory.vo.LowStockAlertVO;

import java.util.List;

/**
 * 库存服务接口
 */
public interface InventoryService {

    Boolean add(Inventory inventory);

    Boolean delete(Integer id);

    Boolean update(Inventory inventory);

    Inventory selectById(Integer id);

    void sendMessge(LowInventoryCapacityMessage message);

    /**
     * 添加库存记录
     * @param request 添加库存请求
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean addInventory(AddInventoryRequest request, Integer userId);

    /**
     * 更新库存数量
     * @param inventoryId 库存ID
     * @param changeCount 变化数量（正数为增加，负数为减少）
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean updateInventoryCount(Integer inventoryId, Integer changeCount, Integer userId);

    /**
     * 查询接种点的库存列表
     * @param vaccinationSiteId 接种点ID
     * @return 库存列表
     */
    List<InventoryVO> getInventoryList(Integer vaccinationSiteId);

    /**
     * 查询低库存预警列表
     * @param vaccinationSiteId 接种点ID（可选，为null时查询所有）
     * @param threshold 库存阈值（默认10）
     * @return 低库存预警列表
     */
    List<LowStockAlertVO> getLowStockAlerts(Integer vaccinationSiteId, Integer threshold);

    /**
     * 根据疫苗ID和接种点ID查询库存
     * @param vaccineId 疫苗ID
     * @param vaccinationSiteId 接种点ID
     * @return 库存记录
     */
    Inventory getByVaccineAndSite(Integer vaccineId, Integer vaccinationSiteId);
}
